﻿package net.molchat.android.core;


// ====================================================== Математические расчеты
public final class Mat {

//========================================================================= Биты
public static final int BIT0 = 0x01;
public static final int BIT1 = 0x02;
public static final int BIT2 = 0x04;
public static final int BIT3 = 0x08;
public static final int BIT4 = 0x10;
public static final int BIT5 = 0x20;
public static final int BIT6 = 0x40;
public static final int BIT7 = 0x80;
public static final int BIT8 = 0x100;

public static final int BIT_FRES = BIT5;

//======================================================== Глобальные переменные
// CRC
private static int crc = 0; // Результат вычисления CRC
private static int[] crcTable = null; // Таблица для быстрого вычисления CRC


//========================================================= Создание CRC-таблицы
public static int[] crcTableMake() {

	crcTable = new int[256];
	for (int n = 0; n < 256; n++) {
		int c = n;
		for (int k = 8; --k >= 0;) {
			if ((c & 1) != 0) {
				c = 0xedb88320 ^ (c >>> 1);
			} else {
				c = c >>> 1;
			}
		}
		crcTable[n] = c;
	}
	return crcTable;
}


//=============================================================== Возвращает CRC
public static int getCrc() {

	return crc;
	//return (long) crc & 0xffffffffL;
}


//=================================================================== Расчет CRC
// Для байтового значения
public static void crcUpdate(int bval) {

	int c = ~crc;
	c = crcTable[(c ^ bval) & 0xff] ^ (c >>> 8);
	crc = ~c;
}


// Ддя байтового массива частично
public static void crcUpdate(byte[] buf, int off, int len) {

	int c = ~crc;
	while (--len >= 0) {
		c = crcTable[(c ^ buf[off++]) & 0xff] ^ (c >>> 8);
	}
	crc = ~c;
}


// Ддя байтового массива целиком
public static void crcUpdate(byte[] buf) {

	crcUpdate(buf, 0, buf.length);
}


//==================================================================== Сброс CRC
public static void crcReset() {

	crc = 0;
}


// ============================================================== Байты в строку
public static String iso2utf(byte[] in, int offset, int len) {

	StringBuffer out = new StringBuffer(len); // Возвращаемая строка
	int q;
	int w;

	len += offset;

	for (q = offset; q < len; q++) {
		w = in[q];
		if (w < 0) {
			w += 1120; // Преобразуем из ISO 8859-5 в UNICODE
		}
		out.append((char) w);
	}
	return out.toString();
}


public static String iso2utf(byte[] in, int len) {

	return iso2utf(in, 0, len);
}


public static String iso2utf(byte[] in) {

	return iso2utf(in, 0, in.length);
}


//=============================================================== Строка в байты
public static byte[] utf2iso(String text) {

	byte[] ret = new byte[text.length()];

	int chr; // Временный символ

	for (int q = 0; q < ret.length; q++) {
		chr = text.charAt(q);
		if ((chr >= 0x401) && (chr <= 0x45f)) {
			chr -= 1120; // 1120=0x460; преобразуем UNICODE в ISO 8859-5
		}
		ret[q] = (byte) chr;
	}


	return ret;
}


// ============================================================= Строка в Cp1251
//public static String utf2win(String text) {
//
//	StringBuffer sBuf = new StringBuffer(text);
//
//	for (int q = sBuf.length() - 1; q >= 0; --q) {
//		char ch = sBuf.charAt(q);
//		if (ch > 0xff) {
//			sBuf.setCharAt(q, (char) (ch - 848));
//		}
//	}
//
//
//	return sBuf.toString();
//}


}
